package com.ruoyi.zsix.service.impl;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.process.AssigneeUserEntity;
import com.ruoyi.common.utils.RedisUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.zsix.domain.taskAssignee.AssigneeDSREntity;
import com.ruoyi.zsix.mapper.taskAssigneeMapper.AssigneeUserMapper;
import com.ruoyi.zsix.service.IAssigneeUserService;
import com.ruoyi.zsix.service.manager.IProcessDefManager;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.HashMap;
import java.util.List;

@Service
public class IAssigneeUserServiceImpl implements IAssigneeUserService {
    @Autowired
    private RedisUtils redisUtils;
    @Autowired
    private AssigneeUserMapper assigneeUserMapper;
    @Autowired
    private IProcessDefManager processDefManager;

    /**
     * 获取节点设置的规则与接收人
     * @param assigneeUserEntity
     * @return
     */
    @Override
    public HashMap<String,Object> getAssigneeUserWithTaskKey(AssigneeUserEntity assigneeUserEntity){
        HashMap<String,Object> hashMap=new HashMap<>();
        List<AssigneeUserEntity> assigneeUserEntityList;
        List<AssigneeDSREntity> assigneeDSREntities;
        String assigneeString ="";
        String assignessdsrStr="";
        if(redisUtils.exists(assigneeUserEntity.getUsertaskid()+"_"+assigneeUserEntity.getRuleName())){
            assigneeString=redisUtils.get(assigneeUserEntity
                    .getUsertaskid()+"_"+assigneeUserEntity.getRuleName()).toString();
        }
        //如果redis中不存在
        if (StringUtils.isEmpty(assigneeString)||assigneeString.equals("[]")) {
            assigneeUserEntityList=assigneeUserMapper.getAssigneeUserWithTaskKey(assigneeUserEntity.getUsertaskid(),assigneeUserEntity.getRuleName());
        }
        else {
            assigneeUserEntityList= JSONObject.parseArray(assigneeString, AssigneeUserEntity.class);
            if(assigneeUserEntity.getRuleName().equals("byUser")
                    ||assigneeUserEntity.getRuleName().equals("byDept")
                    ||assigneeUserEntity.getRuleName().equals("byPosition")
                    ||assigneeUserEntity.getRuleName().equals("byRole")) {
                if (StringUtils.isEmpty(assigneeUserEntityList.get(0).getUsername())
                        && StringUtils.isEmpty(assigneeUserEntityList.get(0).getName())) {
                    assigneeUserEntityList = assigneeUserMapper.getAssigneeUserWithTaskKey(assigneeUserEntity.getUsertaskid(), assigneeUserEntity.getRuleName());
                }
            }
        }
        hashMap.put("assigneeUserEntityList",assigneeUserEntityList);
        if (StringUtils.isEmpty(assignessdsrStr)||assigneeString.equals("[]")) {
            assigneeDSREntities=assigneeUserMapper.getAssigneeDSR(assigneeUserEntity.getUsertaskid());
        }
        else {
            assigneeDSREntities=JSONObject.parseArray(assignessdsrStr, AssigneeDSREntity.class);
            if(StringUtils.isEmpty(assigneeDSREntities.get(0).getId())){
                assigneeDSREntities=assigneeUserMapper.getAssigneeDSR(assigneeUserEntity.getUsertaskid());
            }
        }
        hashMap.put("assigneeDSREntities",assigneeDSREntities);

        return hashMap;
    }
    /***
     * 设置接收人
     * @return
     */
    @Override
    public String setAssigneeUser(JSONObject param){
        //人员数据
        JSONArray userlist = param.getJSONArray("userlist");
        //规则节点id标识
        String usertaskid=param.getString("usertaskid");
        //节点id
        String id=param.getString("id");
        //规则id
        String ruleName=param.getString("ruleName");
        //如果redis中已经存在，先删除
        if(redisUtils.exists(usertaskid)){
            redisUtils.remove(usertaskid);
        }
        //写入redis
        redisUtils.set(usertaskid,userlist.toString(),Long.parseLong("360000") );

        List<AssigneeUserEntity> assigneeUserEntityList=assigneeUserMapper.getAssigneeUserWithTaskKey(id,ruleName);
        if(assigneeUserEntityList.size()>0){
            processDefManager.deleteAssigneeUserByTaskid(id);
            processDefManager.setAssigneeUser(userlist.toString(), id,ruleName);
            return "设置成功";
        }
        else
            return "设置成功";
    }

    /**
     * 移除节点处理人
     * @param assigneeUserEntity
     * @return
     */
    @Override
    public String deleteAssigneeUser(AssigneeUserEntity assigneeUserEntity){
        assigneeUserMapper.deleteAssigneeUser(assigneeUserEntity);

        return "执行成功";
    }
}
